import { def } from './util'

// TODO：改写数组原型中的七中函数，搭配响应式
let methodsNeedChange = [
    'push',
    'pop',
    'unshift',
    'shift',
    'splice',
    'sort',
    'reverse'
]

// 1 先备份原型方法（创建原型为Array的对象）
let arrayMethods = Object.create(Array.prototype)
// 2 遍历
methodsNeedChange.forEach(key => {
    let original = Array.prototype[key]
    // 定义新的方法，不可枚举
    def(arrayMethods, key, function (...args) {
        // 1 获取观察者实例对象
        const ob = this.__ob__
        // 2 有三种方法 push/unshift/splice能给插入新项，现在要把插入的新项变成observe的
        let inserted = []
        // 3 循环查找
        switch (key) {
            case 'push':
                inserted = [...arguments]
                break;
            case 'unshift':
                inserted = [...arguments]
                break;
            case 'splice':
                inserted = [...arguments].slice(2)
                break;
        }
        // 4 是否有插入新项，让新项也变为响应的
        if (inserted.length > 0) {
            ob.observeArray(inserted)
        }

        console.log('执行自定义函数');
        // 发布订阅模式
        ob.dep.notify()

        // 执行原函数方法
        let result = original.call(this, ...args)
        return result
    }, false)
})


export { arrayMethods }